#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int mod=1e9+7;

int n,m,U,ans;
int dp[1<<17][2],tp[1<<17][2];
char s[305][305];

inline void update(int &x,int y)
{
    x+=y;
    if(x>=mod)
        x-=mod;
}

inline void sol(int op)
{
    if(op)
    {
        U=(1<<n)-1;
        for(int i=0;i<=U;i++)
            dp[i][0]=dp[i][1]=tp[i][0]=tp[i][1]=0;
        dp[0][0]=1;

        for(int i=1;i<=m;i++)
        {
            for(int j=0;j<=U;j++)
            {
                if(!dp[j][0])
                    continue;

                if((j&1)&&s[1][i-1]==s[1][i])
                    update(tp[j][0],dp[j][0]);
                update(tp[j|1][0],dp[j][0]);
                update(tp[j&(U-1)][1],dp[j][0]);
            }

            for(int j=0;j<=U;j++)
            {
                dp[j][0]=tp[j][0],tp[j][0]=0;
                dp[j][1]=tp[j][1],tp[j][1]=0;
            }

            for(int x=2;x<=n;x++)
            {
                for(int j=0;j<=U;j++)
                {
                    if((j>>(x-1)&1)&&s[x][i-1]==s[x][i])
                        update(tp[j][0],dp[j][0]);
                    update(tp[j|(1<<(x-1))][0],dp[j][0]);
                    if((!(j>>(x-2)&1))&&s[x-1][i]==s[x][i])
                    {
                        update(tp[j&(U-(1<<(x-1)))][0],dp[j][0]);
                        update(tp[j&(U-(1<<(x-1)))][0],dp[j][1]);
                    }
                    update(tp[j&(U-(1<<(x-1)))][1],dp[j][0]);
                }

                for(int j=0;j<=U;j++)
                {
                    dp[j][0]=tp[j][0],tp[j][0]=0;
                    dp[j][1]=tp[j][1],tp[j][1]=0;
                }
            }
        }
    }
    else
    {
        U=(1<<m)-1;
        for(int i=0;i<=U;i++)
            dp[i][0]=dp[i][1]=tp[i][0]=tp[i][1]=0;
        dp[0][0]=1;

        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=U;j++)
            {
                if(!dp[j][0])
                    continue;

                if((j&1)&&s[i-1][1]==s[i][1])
                    update(tp[j][0],dp[j][0]);
                update(tp[j|1][0],dp[j][0]);
                update(tp[j&(U-1)][1],dp[j][0]);
            }

            for(int j=0;j<=U;j++)
            {
                dp[j][0]=tp[j][0],tp[j][0]=0;
                dp[j][1]=tp[j][1],tp[j][1]=0;
            }

            for(int x=2;x<=m;x++)
            {
                for(int j=0;j<=U;j++)
                {
                    if((j>>(x-1)&1)&&s[i-1][x]==s[i][x])
                        update(tp[j][0],dp[j][0]);
                    update(tp[j|(1<<(x-1))][0],dp[j][0]);
                    if((!(j>>(x-2)&1))&&s[i][x-1]==s[i][x])
                    {
                        update(tp[j&(U-(1<<(x-1)))][0],dp[j][0]);
                        update(tp[j&(U-(1<<(x-1)))][0],dp[j][1]);
                    }
                    update(tp[j&(U-(1<<(x-1)))][1],dp[j][0]);
                }

                for(int j=0;j<=U;j++)
                {
                    dp[j][0]=tp[j][0],tp[j][0]=0;
                    dp[j][1]=tp[j][1],tp[j][1]=0;
                }
            }
        }
    }

    ans=0;
    for(int i=0;i<=U;i++)
        update(ans,dp[i][0]);
    cout<<ans<<' ';
}

int main()
{
    freopen("disanti.in","r",stdin);
    freopen("disanti.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    cin>>n>>m;

    for(int i=1;i<=n;i++)
        cin>>(s[i]+1);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            s[i][j]='0'+'1'-s[i][j];

            if(n<m)
                sol(1);
            else
                sol(0);

            s[i][j]='0'+'1'-s[i][j];
        }

        cout<<'\n';
    }

    return 0;
}